前面提到,我們今天如果想透過這段程式碼來達成我們想在 WordPress 上面的一些目的就得透過 hook。正因如此,hooks 也是 WordPress 外掛和主題與 WordPress 核心程式碼互動的基礎。
因此,WordPress 核心提供了許多好用的 hooks ,來幫助開發者開發 WordPress 外掛或是主題。當然了,我們也可以自己埋 hook 讓第三方開發者新增或修改我們的功能。
在使用 action hook 之前,我們先來看看埋 action hook 的語法:
WordPress 提供了一個好用的函式讓我們可以埋 action hook ,叫做 do_action()。
do_action('do_something'); // 我們在某個角落埋下了一個 'do_something' 的 action hook
接著我們就可以來試看看剛剛埋的 action hook 囉!
我們可以通過兩個步驟新增一個函數到 action hook 上面。
這裡說一下 add_action() 這個函式,這個函式基本需要傳遞兩個參數:第一個是 hook 名稱(也就是你要去觸發哪個 hook );第二個是 回呼函式(就是剛剛你創建的那個回呼函式)。
下面示範一個在剛剛埋的 action hook (do_something)上,插入我的自定義 love_wp 回呼函式:
<?php
function love_wp() {
// 做一些事情
}
add_action('do_something', 'love_wp');
是的,就是這麼簡單!所以囉,在 WordPress 的世界埋了許許多多的 hooks ,我們可以通過查看 WordPress 核心、主題或外掛的原始碼找到自己可以用到的 hook。
再來講更複雜一點點點點的,剛剛如果有打開官方文件,看 add_action() 這個 function 的話,應該會看到,後面還可以塞很多參數誒!
沒錯,add_action() 除了上述的兩個參數之外,還可以接受兩個額外的參數,分別是 $priority (優先級),和 $accepted_args (定義傳遞給回呼函式的參數數量)。
我們先來聊聊優先權。今天如果一個 hook 上面掛載了一堆回呼函式,那誰先誰後呢?這時候 hooks 可能就需要一個優先權,來確定這些回呼函式的執行順序。優先權只接受整數,默認的整數為 10,數字越小,就越優先。
例如,下面的回呼函式全部掛載到了剛剛我埋的 action hook上面,但他們有不同的優先權。
<?php
add_action('do_something', 'run_me_early', 9);
add_action('do_something', 'run_me_normal'); // 沒有指定,默認為 10
add_action('do_something', 'run_me_late', 11);
上面的 hook 都是 do_something ,但是執行的順序就被改變了! run_me_early() 會先被第一個運行,其次是 run_me_normal(),最後一個才會是 run_me_late() 被運行。
講完優先權,接著我們來講講如何定義傳遞給回呼函式的參數數量。
有時候,action hook 會需要接收一些參數放進函式。例如,當 WordPress 保存一篇文章時,有一個 save_post 這個 action hook,這個 action hook 會有三個參數,分別是:
do_action( 'save_post', $post_ID, $post, $update );
所以,當我們想要放個 自定義函式 love_wp() 到 save_post 這個 action hook 時,我們就需要告訴他需要接收三個參數:
add_action('save_post', 'love_wp', 10, 3);
簡單說,就是我要去掛上一個 love_wp() 這個自定義函式,優先權是 10 、要被放入 3 個參數
然後我們就可以在剛剛我自己定義的函式中使用 Hook 提供的參數了。
function love_wp( $post_ID, $post, $update ) {
// 做點事情吧
}
接著明天,我們會來聊聊 Filter Hooks~